import java.util.Set;
import java.util.Stack;

public class MinStack {

    // 定义两个栈： 一个用来存储普通，一个用来存储最小值
    private  Stack<Integer> stack;
    private Stack<Integer> minstack;
    public MinStack() {
        stack=new Stack<>();
        minstack=new Stack<>();
    }

    // 入栈
    public void push(int val) {
        stack.push(val);
        if(minstack.empty()){
            minstack.push(val);
        }else {
            int peekVal = minstack.peek();
            if (peekVal >= val) {
                minstack.push(val);
            }
        }
    }

    // 出栈： 输出普通栈的栈顶元素 ，如果 最小栈的栈顶元素与 普通栈的相等，则一起出栈
    public void pop() {
        // 将普通栈的栈顶元素拿出来
        int min=stack.pop();

        if(!minstack.empty()){
            // 如果 最小栈的栈顶元素与 普通栈的相等，则一起出栈
            if(minstack.peek()==min){
                minstack.pop();
            }
        }

    }

    // 跟 peek 类似: 查看普通栈的栈顶元素
    public int top() {
        return stack.peek();
    }

    public int getMin() {
        if(minstack != null){
            return minstack.peek();
        }
        return -1;
    }
}